package org.blogwu.sso.filter;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.blogwu.sso.until.encryption.Base64Until;
import org.blogwu.sso.until.encryption.MD5Util;
import org.blogwu.sso.until.string.StringUtils;
import org.bouncycastle.cert.ocsp.Req;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;

public class AccessFilter extends ZuulFilter  {
	private static Logger log = LoggerFactory.getLogger(AccessFilter.class);

	/**
	 * filterType：返回一个字符串代表过滤器的类型，在zuul中定义了四种不同生命周期的过滤器类型，具体如下：
		pre：可以在请求被路由之前调用
		routing：在路由请求时候被调用
		post：在routing和error过滤器之后被调用
		error：处理请求时发生错误时被调用
	 */
	@Override
	public String filterType() {
		return "pre";
	}

	/*
	 * 
	 * filterOrder：通过int值来定义过滤器的执行顺序
	 */
	@Override
	public int filterOrder() {
		return 1;
	}
	/**
	 * shouldFilter：返回一个 类型来判断该过滤器是否要执行，所以通过此函数可实现过滤器的开关。
	 *  在上例中，我们直接返回true，所以该过滤器总是生效。
	 */
	@Override
	public boolean shouldFilter() {
		return true;
	}


	@Override
	public Object run() {
		RequestContext ctx = RequestContext.getCurrentContext();
		HttpServletRequest request = ctx.getRequest();
		Map result=new HashMap();
		log.info(String.format("%s request to %s", request.getMethod(), request.getRequestURL().toString()));//实列:GET request to http://localhost:5555/api-a-url/add
		ctx.getResponse().setContentType("text/html;charset=UTF-8");
		String userRequest=request.getMethod();//用户请求方式
		String userRequestUrl=request.getRequestURI();//用户请求url


		Object accessKey=request.getParameter("accessKey");//判断是注册还是登陆  0是登陆  1是注册
		Object accessToken = request.getParameter("accessToken");//前端加密的key
		Object timestamp=request.getParameter("timestamp");//时间戳
		Object username=request.getParameter("username");//用户名
		Object password=request.getParameter("password");//密码
		Object emailAddress=request.getParameter("emailAddress");//邮箱地址
		String [] splitParm=userRequestUrl.split("/");

		//注册登录都需要监测用户名  密码
		if(splitParm[4].equals("userLogin") || splitParm[4].equals("userRegister")){//用户登录  注册
			if(StringUtils.isBlank(accessKey,accessToken,timestamp)){
				log.warn("access token is empty");
				ctx.setSendZuulResponse(false);//令zuul过滤该请求，不对其进行路由
				ctx.setResponseStatusCode(500);//设置了其返回的错误码
				ctx.setResponseBody("请求错误");//对返回body内容进行编辑等。
				return null;
			}
			if(StringUtils.isBlank(username,password)){
				log.warn("user information is null");
				ctx.setSendZuulResponse(false);//令zuul过滤该请求，不对其进行路由
				ctx.setResponseStatusCode(401);//设置了其返回的错误码
				ctx.setResponseBody("请输入用户名密码");//对返回body内容进行编辑等。
				return null;
			}
				//加密       MD5(bae64(加密数据))
			String encryptionDate=MD5Util.MD5(Base64Until.getBase64(username.toString()+password.toString()+timestamp.toString()));
			if(! encryptionDate.equals(accessToken.toString())){
				log.warn("access token is error");
				ctx.setSendZuulResponse(false);//令zuul过滤该请求，不对其进行路由
				ctx.setResponseStatusCode(500);//设置了其返回的错误码
				ctx.setResponseBody("请求错误");//对返回body内容进行编辑等。
			}
		}
		if(splitParm[4].equals("sendRegistEmail")){
			//Object userEmail=request.getParameter("userEmail");//email
			if(StringUtils.isBlank(emailAddress)|| emailAddress.toString().length()>20){
				log.warn("user emaill is null");
				ctx.setSendZuulResponse(false);//令zuul过滤该请求，不对其进行路由
				ctx.setResponseStatusCode(500);//设置了其返回的错误码
				ctx.setResponseBody("邮箱为空或或者邮箱长度不正确");//对返回body内容进行编辑等。
			}
			
			
		}





		//		if(accessToken == null) {
		//			log.warn("access token is empty");
		//			ctx.setSendZuulResponse(false);//令zuul过滤该请求，不对其进行路由
		//			ctx.setResponseStatusCode(401);//设置了其返回的错误码
		//			ctx.setResponseBody("请输入用户名密码");//对返回body内容进行编辑等。
		//			return null;
		//		}
		log.info("access token ok");
		return null;
	}
}